#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED

#include "Deque.h"

namespace CEngine {

template<class Type>
class Queue {
    public:

        ///Creates an empty Queue. Does not allocate memory.
        Queue(void);

        ///Creates a Queue numberOfElements long, elements use a blank constructor.
        Queue(const U64 numberOfElements);

        ///Creates a Queue numberOfElements long, elements are all set to defaultValue.
        Queue(const U64 numberOfElements, const Type& defaultValue);

        ///Creates a copy of Queue.
        Queue(const Queue& Queue);

        ///Creates a copy of Deque.
        Queue(const Deque<Type>& Deque);

        ///Copies the contents of Due (destroys all previous elements).
        ///Only increases capacity if needed.
        Queue&
        operator= (const Queue& Queue);

        ///Copies the contents of Deque (destroys all previous elements).
        ///Only increases capacity if needed.
        Queue&
        operator= (const Deque<Type>& Deque);

        ///Destructor.
        ~Queue(void);

        ///Access function. Returns the element at the front of the Queue.
        Type&
        front(void);

        ///Access function. Returns the element at the end of the Queue.
        Type&
        back(void);

        ///Adds an element to the end of the Queue.
        void
        pushBack(const Type& element);

        ///Deletes the first element in the Queue.
        void
        popFront(void);

        ///Returns if there are any elements in the Queue.
        bool
        isEmpty(void) const;

        ///Returns the number of elements in the Queue.
        U64
        getSize(void) const;

    private:

        Deque<Type> deque;
};

}

#include "QueueCore.h"

#endif // QUEUE_H_INCLUDED
